import logging
import time

import requests.exceptions
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager

# 配置 Chrome 无头模式
chrome_options = Options()
chrome_options.add_argument("--headless=new")  # 启用无头模式（new 是 Chrome 112+ 的推荐写法）
chrome_options.add_argument("--disable-gpu")  # 禁用 GPU 加速（部分系统需要）
chrome_options.add_argument("--window-size=1920,1080")  # 设置窗口大小（避免元素定位问题）

# 获取日志器
logger = logging.getLogger("selenium_login")


def auto_login(url, username, password,
               username_field_id="username",
               password_field_id="password",
               login_button_xpath="//button[@type='submit']",
               exit_button_xpath="//button[@type='submit']"):
    """
    使用 Selenium 自动登录网站

    参数:
        url: 登录页面 URL
        username: 用户名
        password: 密码
        username_field_id: 用户名输入框的 ID
        password_field_id: 密码输入框的 ID
        login_button_xpath: 登录按钮的 XPath
    """
    # 自动更新
    # 1. 自动下载对应版本的ChromeDriver，并创建Service对象
    try:
        chrome_service = Service(ChromeDriverManager().install())
        # 2. 启动Chrome浏览器（无需手动指定ChromeDriver路径）
        driver = webdriver.Chrome(service=chrome_service, options=chrome_options)
    except requests.exceptions.ConnectionError as e:
        logger.error("网络连接异常，请检查网络！{}".format(e))
        return

    # 手动下载chromedriver，更新初始化浏览器驱动（这里使用 Chrome，需要下载对应版本的 chromedriver）
    # 确保 chromedriver 已添加到系统 PATH 或指定 executable_path
    # driver = webdriver.Chrome(options=chrome_options)

    try:
        # 打开登录页面
        driver.get(url)
        driver.maximize_window()
        time.sleep(2)  # 等待页面加载

        # 等待并输入用户名
        username_field = WebDriverWait(driver, 10).until(
            ec.presence_of_element_located((By.ID, username_field_id))
        )
        username_field.clear()
        username_field.send_keys(username)

        # 输入密码
        password_field = driver.find_element(By.ID, password_field_id)
        password_field.clear()
        password_field.send_keys(password)

        # 点击登录按钮
        login_button = WebDriverWait(driver, 10).until(
            ec.element_to_be_clickable((By.XPATH, login_button_xpath))
        )
        login_button.click()

        # 等待登录完成（根据实际情况调整等待条件）
        time.sleep(3)

        # 验证登录是否成功（这里以 URL 变化为例，可根据实际情况修改）
        if "dashboard" in driver.current_url or "home" in driver.current_url:
            logger.info("登录成功！")
            # 登录成功后可以进行后续操作
            # 例如：获取登录后的页面信息
            logger.info("当前页面标题: {}".format(driver.title))
        else:
            logger.error("登录可能失败，请检查账号密码或页面结构是否变化")

        # 退出登录
        exit_button = WebDriverWait(driver, 10).until(
            ec.element_to_be_clickable((By.XPATH, exit_button_xpath))
        )
        if exit_button:
            exit_button.click()
            logger.info("注销成功！浏览器关闭")
        # 关闭浏览器
        driver.quit()

    except TimeoutException:
        logger.error("元素加载超时，请检查页面元素是否正确")
    except NoSuchElementException:
        logger.error("未找到指定元素，请检查选择器是否正确")
    except Exception as e:
        logger.error("登录过程中发生错误: {}".format(str(e)))
    finally:
        # 关闭浏览器
        driver.quit()


if __name__ == "__main__":
    # 示例：替换为目标网站的登录信息
    LOGIN_URL = "http://172.16.4.2/Self/login/"  # 替换为实际登录页面 URL
    USERNAME = "your_username"  # 替换为你的用户名
    PASSWORD = "your_password"  # 替换为你的密码

    # 根据实际页面的 HTML 元素调整以下参数
    auto_login(
        url=LOGIN_URL,
        username='2025012719',
        password='21221X',
        username_field_id="account",  # 替换为实际用户名输入框的 ID
        password_field_id="password",  # 替换为实际密码输入框的 ID
        login_button_xpath="//*[@id='loginSet']/div/div/form/div[5]/button",  # 替换为实际登录按钮的 XPath
        exit_button_xpath="//*[@id='OnlineLisBig']/tbody/tr/td[8]/a"
    )
